﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once
#include "GcmpModelInterface.h"
#include "ElementId.h"
#include "GbmpQuickCast.h"
#include "IDbObject.h"
namespace gcmp
{
    class IDocument;
    class IParameterValueStorage;
    class IParameterValueDisplayString;
    class UniIdentity;

    /// \brief 参数值列表类
    class GCMP_MODEL_INTERFACE_EXPORT IParameterValueList : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IParameterValueList, gcmp::IDbObject)

    public:
        /// \brief 创建静态的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符 pParameterValueDisplayStrings
        /// \param pParameterValueDisplayStrings  参数值显示字符串数组
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterStaticValueList(const UniIdentity &uid, std::vector<OwnerPtr<IParameterValueDisplayString>> &pParameterValueDisplayStrings);

        /// \brief 创建标高的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterDocumentLevelList(const UniIdentity &uid);

        /// \brief 创建关联平面的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterAssociatePlaneList(const UniIdentity &uid);

        /// \brief 创建视图缩放比例的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterViewScaleList(const UniIdentity &uid);

        /// \brief 创建子类别的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterSubCategoryList(const UniIdentity &uid);

        /// \brief 创建轮廓族类型的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterProfileFamilyTypeList(const UniIdentity &uid);

        /// \brief 创建材质类型的参数值列表
        ///
        /// \param uid  参数跨文档唯一标识符
        /// \return 参数值列表
        static OwnerPtr<IParameterValueList> CreateParameterValueMaterialList(const UniIdentity &uid);


        /// \brief 克隆当前参数值列表
        ///
        /// \return 参数值列表
        virtual OwnerPtr<IParameterValueList> Clone() const = 0;

        /// \brief 返回参数标识符
        ///
        /// \return 参数标识符
        virtual const UniIdentity& GetUid() const = 0; 

        /// \brief 获取给定参数值对应的显示字符串
        ///
        /// \param pDocument 文档指针
        /// \param pValue  参数值
        /// \param elementIds  文档元素标识符数组
        /// \return 给定参数值对应的显示字符串
        virtual std::wstring GetDisplayStringByValue(const IDocument* pDocument, const IParameterValueStorage* pValue, const std::vector<ElementId>& elementIds = std::vector<ElementId>()) const = 0;
      
        /// \brief 根据给定显示字符串，返回对应的参数值
        ///
        ///   如果文档基本元素标识符数组不为空，将返回给定文档基本元素的公共参数值与给定显示字符串匹配的参数值
        /// \param pDocument 文档指针
        /// \param displayString 字符串
        /// \param elementIds 文档基本元素标识符数组
        /// \return 参数值
        virtual OwnerPtr<IParameterValueStorage> GetValueByDisplayString(const IDocument* pDocument, const std::wstring& displayString, const std::vector<ElementId>& elementIds = std::vector<ElementId>()) const = 0;

        /// \brief 返回参数值列表中所有参数值的显示字符串
        ///
        ///   如果文档基本元素标识符数组不为空，将返回给定元素的公共参数值对应的显示字符串数组
        /// \param pDocument 文档指针
        /// \param elementIds 文档基本元素标识符数组
        /// \return 参数值的显示字符串数组
        virtual std::vector<std::wstring> GetDisplayStrings(const IDocument* pDocument, const std::vector<ElementId>& elementIds = std::vector<ElementId>()) const = 0;

        /// \brief 返回DropdownList中所有参数值
        ///
        ///   如果文档基本元素标识符数组不为空，将返回给定元素的公共参数值
        /// \param pDocument 文档指针
        /// \param elementIds 文档基本元素标识符数组
        /// \return 参数值数组
        virtual std::vector<OwnerPtr<IParameterValueStorage>> GetValues(const IDocument* pDocument, const std::vector<ElementId>& ids = std::vector<ElementId>()) const = 0;

        /// \brief 返回参数值列表是否有外部编辑器
        /// \return 如果有外部编辑器返回true，否则返回false
        virtual bool HasOuterEditor() const = 0;

        /// \brief 返回参数值是否支持手动输入修改（不在列表选择值，外部输入值）
        /// \return 支持非参数列表值输入修改返回true，否则返回false
        virtual bool IsManualInputModifiable(const IDocument* pDoc) const = 0;
    };

}



